package data.utils;
/**
 * @author Charles Perin
 * 29 mars 2011
 * LIMSI - INRIA Rennes
 * charles.perin@free.fr
 *
 */
public class Bezier{
	private int nbPts;
	private float[] xValues;
	private float[] yValues;   

	public Bezier(int nbPts,float xValues[],float yValues[]){
		this.nbPts=nbPts;
		this.xValues=new float[nbPts];
		this.yValues=new float[nbPts];
		for(int k=0;k<nbPts;k++){
			this.xValues[k]=xValues[k];
			this.yValues[k]=yValues[k];
		}
	}

	/** public int  getNbrPoints(): rend le nombre de points de controle*/
	public int getNbrPoints(){
		return nbPts;
	}

	/** public float getXControlPt(int i): rend l'abscisse du point de controle i*/
	public float getXControlPt(int i){
		return xValues[i];
	}

	/** public float getYControlPt(int i): rend l'ordonnee du point de controle i */
	public float getYControlPt(int i){
		return yValues[i];
	}

	/** public float interpol(float t, float a, float b): rend l'interpolation lineaire en t entre a et b */
	public float interpol(float t, float a, float b){
		return a*(1-t)+b*t;
	}

	/** public float xBezier(float t): rend l'abscisse en t d'un point de la courbe de Bezier (tentre 0 et 1)*/
	public  float xBezier(float t){  
		float xbezier;
		float[] xjp=new float[nbPts];
		for(int i=0;i<nbPts;i++){
			xjp[i]=xValues[i];   
		}
		for(int j=1;j<=(nbPts-1);j++){
			if((nbPts-j)>=1){
				float[] xj=new float[nbPts-j];          
				for(int i=0;i<(nbPts-j);i++){
					xj[i]=interpol(t,xjp[i],xjp[i+1]);       
				}
				for(int i=0;i<(nbPts-j);i++){
					xjp[i]=xj[i];  
				}
			} 
		}
		xbezier=xjp[0];
		return xbezier;
	}

	/** public float yBezier(float t): rend l'ordonnee en t d'un point de la courbe de Bezier (t  dans [0 ,1])*/
	public  float yBezier(float t){  
		float ybezier;
		float[] yjp=new float[nbPts];
		for(int i=0;i<nbPts;i++){
			yjp[i]=yValues[i];   
		}
		for(int j=1;j<=(nbPts-1);j++){
			if((nbPts-j)>=1){
				float[] yj=new float[nbPts-j];          
				for(int i=0;i<(nbPts-j);i++){
					yj[i]=interpol(t,yjp[i],yjp[i+1]);       
				}
				for(int i=0;i<(nbPts-j);i++){
					yjp[i]=yj[i];  
				}
			} 
		}
		ybezier=yjp[0];
		return ybezier;
	}

	protected void finalize() throws Throwable{
		xValues=null;
		yValues=null;
		super.finalize();
	}
}  

